import {
	http
} from '@/utils/luch-request/index.js'

console.log("2 "+uni.getStorageSync('rbacToken'))
// 防抖
export function _debounce(func,delay) {
    let timeout;
	var delay = delay || 200;
    return function () {
        let context = this;
        let args = arguments;

        if (timeout) clearTimeout(timeout);

        let callNow = !timeout;
        timeout = setTimeout(() => {
            timeout = null;
        }, delay)

        if (callNow) func.apply(context, args)
    }
}
// 节流
export function _throttle(fn, interval) {
    var last;
    var timer;
    var interval = interval || 200;
    return function () {
        var th = this;
        var args = arguments;
        var now = +new Date();
        if (last && now - last < interval) {
            clearTimeout(timer);
            timer = setTimeout(function () {
                last = now;
                fn.apply(th, args);
            }, interval);
        } else {
            last = now;
            fn.apply(th, args);
        }
    }
}

// 距离计算
/**
 * @extends {mode} String 计算方式，取值; driving：驾车 walking：步行 bicycling：自行车
 * @extends {from} String 起点坐标  
 * 例1：
 * from=39.071510,117.190091
 * 例2：
 * from=39.071510,117.190091,270;39.108951,117.279396,180
 * 格式： lat,lng,[header],[roadtype],[speed],[accuracy],[timestamp]｜lat,lng,[header],[roadtype],[speed],[accuracy],[timestamp]…
 * [必填]lat 为纬度，lng 为经度
 * [选填] header 为车头方向（正北为0度，顺时针一周为360度）
 * 如下参数为前序点传参，仅在驾车(driving)模式下生效
 * [选填] roadtype 为道路类型，取值：0 不考虑道路类型、1 在桥上、2 在桥下、3 在主路、4 在辅路、5 在对面、6 桥下主路、7 桥下辅路
 * [选填] speed 为速度，无具体值时可传-1
 * [选填] accuracy 为GPS精度，单位：毫米，无具体值时可传0
 * [选填] timestamp 为时间戳，精确到秒，请传真实时间戳，否则前序点会不生效
 * 注意： 前序点之间使用“｜”分隔，前序点最多支持设置5个（包含起点），最后一个点会作为此次计算的起点
 * 个数限制： 多对一计算<=200个，多对多计算from和to坐标数乘积<=625且单侧<=50个
 * @extends {to} String 终点坐标
 * 格式： lat,lng;lat,lng…
 * （经度与纬度用英文逗号分隔，坐标间用英文分号分隔）
 * 个数限制： 一对多计算<=200个，多对多计算from和to坐标数乘积<=625且单侧<=50个
 */
export const getDistance = (from, to, mode = "walking",) => {
	return new Promise((resolve, reject) => {
		try {
			uni.request({
			    url: 'https://apis.map.qq.com/ws/distance/v1/matrix/', //仅为示例，并非真实接口地址。
				method: "GET",
				data:{
					from,to,
					key: 'LPRBZ-KNBR6-IBKSY-EZNGX-OZGCE-FKBDK'
				},
			    header: {
			        'Content-Type': 'application/json;charset=UTF-8',
			        'Access-Control-Allow-Headers':'*'
			    },
			    success: (res) => {
			        resolve(res.data)
			    }
			});
		} catch (error) {
			uni.showToast({ title: 'uploading error!' })
			reject(error)
		}
	})
}
// 获取数组的params字段默认用来获取rbacToken;
export const _getUrlParams = function (name) {
	const url2 = window.location.href;
	const temp2 = url2.split('?')[1];
	const pram2 = new URLSearchParams(`?${temp2}`);
	let data = pram2.get(name);
	if (!data) return null;
	if (data.indexOf('#/') >= 0) {
		data = data.split('#/')[0];
	}
	return data;
};

// 逆地址解析
export const getGeocoder = (longitude,latitude) => {
	return new Promise((resolve, reject) => {
		try {
			console.log("---------------",longitude,latitude)
			uni.request({
			    url: 'https://apis.map.qq.com/ws/geocoder/v1/', //仅为示例，并非真实接口地址。
				method: "GET",
				data:{
					location: `${latitude},${longitude}`,
					key: 'LPRBZ-KNBR6-IBKSY-EZNGX-OZGCE-FKBDK'
				},
			    header: {
			        'Content-Type': 'application/json;charset=UTF-8',
			        'Access-Control-Allow-Headers':'*'
			    },
			    success: (res) => {
			        resolve(res.data)
			    },
				fail(err) {
					console.log(err,"报错信息")
				}
			});
		} catch (error) {
			uni.showToast({ title: 'uploading error!' })
			reject(error)
		}
	})
}

//获取form表单字段的方法
export const getFormFieldsValue = function(_this) {

	return _this.$refs.FormInfo.$refs.form.validate().then(res => {
		console.log(res)
		return res;
	}).catch(err => {
		showToastOrNavTo({
			icon:"error",
			title:err[0].errorMessage
		})
		//需要一个终止进行下面代码的方法
		throw err;
	})
}
//封装公共路径跳转的方法
export const navTo = function(url, params) {
	if(!isNaN(parseInt(url))){
		uni.navigateBack({
			delta:Number(url)
		})
		return ;
	}
	let _params = "";
	params ?
		Object.keys(params).map(function(key, idx) {
			_params = _params + `${idx == 0 ? '?' : '&'}${key}=${params[key]}`;
		}) : null;
	uni.navigateTo({
		url: url + _params,
	})
}
//提示文字+路径跳转方法
//如果没有传navTo对象 则不进行跳转 只进行提示
export const showToastOrNavTo  = function(conf){
	const {  title ,duration ,icon ,image , navTo:_navTo  }  = conf;
	uni.showToast({
		//icon 类型 success error loading none
		//none 不显示图标，此时 title 文本在小程序最多可显示两行，App仅支持单行显示。
		icon:icon ? icon : 'success',
		//自定义图标路径
		image: image ? image : null,
		mask:true,
	    title: title || "操作成功",
	    duration: Number(duration) || 1500,
		complete:function(){
			_navTo ?
			setTimeout(function(){
				navTo(_navTo.url,_navTo.params)
			},duration || 1500) : null
		}
	});

}
//文件上传方法
export const _uploadFile = function(url, path) {
	var data;
	return new Promise(function(resolve) {
		uni.uploadFile({
			url: url,
			filePath: path,
			name: 'files',
			formData: {},
			header: {
				"rbacToken": uni.getStorageSync('rbacToken')
			},
			success: function(res) {
				try {
					//Tip : 切记->主要修改这里图片的返回值为真实返回路径!!! 详情见示例
					data = JSON.parse(res.data);
				} catch (e) {
					throw (e, data);
				}
				// 根据自己的返回数据做相应判断,服务器返回200即代表成功请求
				if (data.success == '1' || data.success == '200') {
					resolve(data.data)
				}
			},
			fail: function(res) {
				console.log(res);

			}
		});
	});
}
//加载动画模态层
export const loadingState = (boolean) => {
	boolean ? boolean : boolean = true;
	if(boolean){
		uni.showLoading({
			title: '加载中,请等待...',
			mask: true
		})
	}else{
		uni.hideLoading();
	}

}
export const hideLoading = () => {
	uni.hideLoading();
}
//获取设备信息方法
export const getClientInfo = () => {
	var cid, getClientInfo;
	return new Promise(function(resolve) {
		try {
			if (window && window.plus) {
			} else {
				if (plus) {
					//#ifdef APP-PLUS
					getClientInfo = plus.push.getClientInfo();
					cid = getClientInfo.clientid;
					console.log(cid);
					console.log(getClientInfo);
					resolve({
						cid,
						getClientInfo
					})
					//#endif
				} else {
					plus.globalEvent.addEventListener('plusready', function() {
						if (cid && cid != 'undefind' && cid != '' && cid != 'null') {
							return;
						}
						//#ifdef APP-PLUS
						getClientInfo = plus.push.getClientInfo();
						//#endif
						cid = getClientInfo.clientid;
						console.log(cid);
						console.log(getClientInfo);
						resolve({
							cid,
							getClientInfo
						})
					});

				}

			}
		} catch (e) {
			//#ifdef H5
			resolve({})
			//#endif
			//TODO handle the exception
		}
	})
}
//默认的登录方法
export const loginFn = async (userName, userPassword,navUrl, cid) => {

	//userName 登录用户名
	//userPassword 登录密码
	//navUrl 登录完毕后跳转的地址
	// cid  设备的唯一标识
	uni.setStorageSync('userInfo', JSON.stringify({
	userName:"",
	userPassword:""
	}));
	//如果在外面没有传入设备的 cid  则在此进行获取 (可能会花费时间)
	const _cid = cid || await getClientInfo().cid || "";
	loadingState()

	http.post('/fy-rbac/login/login', {
		userName: userName,
		userPassword: userPassword,
		// //#ifdef APP-PLUS
		// cid: _cid
		// //#endif
	}).then(res => {
		uni.hideLoading();
		if (res.data.success == 1) {


			uni.setStorageSync('rbacToken', res.data.data.rbacToken);

			uni.setStorageSync('userInfo', JSON.stringify({
				...res.data.data,
				userName: userName,
				userPassword: userPassword,
				rbacToken: res.data.data.rbacToken,
			}));
			uni.showToast({
				mask: true,
				title: '登录成功',
				success: () => {},
				complete: () => {
					setTimeout(() => {
						navTo(navUrl);
					}, 1500);
				}
			});
		} else {
			uni.showToast({
				icon: 'none',
				title: res.data.message
			});
		}
	})


}

//扫码的方法 h5 不兼容
export const scanCode = (conf) => {
	const { onlyFromCamera , scanType} = conf || {};
	return new Promise(function(resolve){
		uni.scanCode({
			//是否只能从相机扫码，不允许从相册选择图片
			onlyFromCamera:onlyFromCamera || true,
			//扫码类型，参数类型是数组，二维码是'qrCode'，一维码是'barCode'，DataMatrix是‘datamatrix’，pdf417是‘pdf417’。
			scanType:scanType || ['qrCode'],
			success:function(...data){
				resolve(...data)
			},
			fail:function(err){
				if(err.errMsg.includes("cancel")){
					return ;
				}else{
					showToastOrNavTo({
						icon:"error",
						title:"扫码失败",
					})
				}
			},
			complete:function(){}
		})
	})

}
